/*
 * 文件名：WebsocetServer.java	 
 * 时     间：上午9:49:59
 * 作     者：lyf       
 * 版     权： 2012-2022 湖南智软网络科技, 公司保留所有权利.
 * 联     系：http://www.073586.com/
 */
package com.cz073586.message.websocket356.server;

import java.io.IOException;

import javax.websocket.CloseReason;
import javax.websocket.EncodeException;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import com.cz073586.message.websocket356.converts.MessageDecoder;
import com.cz073586.message.websocket356.converts.MessageEncoder;
import com.cz073586.message.websocket356.transfer.TransferVo;
import com.cz073586.tools.util.Log4jUtil;

/**
 * 类描述: 消息推送中心服务端，满足于webSocet JSR 356 规范.改服务端只负责中转消息{@code}TransferVo.
 * 
 * @ClassName: WebsocetServer
 * @author lyf
 * @date 2015年7月21日 上午9:49:59
 */
@ServerEndpoint(value = "/messageCentre/push", encoders = { MessageEncoder.class }, decoders = { MessageDecoder.class })
public class WebsocetServer
{
	private final static Log4jUtil log = Log4jUtil
			.getLog4j(WebsocetServer.class);
	
	/**
	 * 
	 * 方法描述： 客户端连接
	 * 
	 * @Title: onOpenConnect
	 * @param @param session
	 * @return void
	 * @user lyf 2015年7月21日
	 * @throws
	 */
	@OnOpen
	public void onOpenConnect(Session session)
	{
		if (log.isDebugEnabled())
		{
			log.info("Server of WebSocket opened: " + session.getId());
		}
	}
	
	@OnMessage
	public void onMessage(Session session, TransferVo<?> msg)
	{
		if (log.isDebugEnabled())
		{
			log.info("Server WebSocket received message:  " + msg.getKeyWord());
		}
		sendToAll(session, msg);
	}
	
	/**
	 * 
	 * 方法描述： 发送所有
	 * 
	 * @Title: sendToAll
	 * @param @param session
	 * @param @param msg
	 * @return void
	 * @user lyf 2015年7月21日
	 * @throws
	 */
	public void sendToAll(Session session, TransferVo<?> msg)
	{
		for (Session subSession : session.getOpenSessions())
		{
			try
			{
				if (session.getId().equals(subSession.getId()))
				{
					continue;
				}
				RemoteEndpoint.Basic other = subSession.getBasicRemote();
				other.sendObject(msg);
			} catch (Throwable e)
			{
				log.error("", e);
			}
		}
	}
	
	/**
	 * 
	 * 方法描述： 连接关闭
	 * 
	 * @Title: onClose
	 * @param @param session
	 * @param @param reason
	 * @return void
	 * @user lyf 2015年7月21日
	 * @throws
	 */
	public void onClose(Session session, CloseReason reason)
	{
		if (log.isDebugEnabled())
		{
			log.info("Server Closing a WebSocket due to " + session.getId());
		}
	}
	
	@OnError
	public void onError(Session session, Throwable throwable)
	{
		log.error("server of websocket is mistaked:", throwable);
	}
}
